package com.linyaonan.leetcode.medium._43;


import java.math.BigInteger;

/**
 * 给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
 * <p>
 * 示例 1:
 * <p>
 * 输入: num1 = "2", num2 = "3"
 * 输出: "6"
 * 示例 2:
 * <p>
 * 输入: num1 = "123", num2 = "456"
 * 输出: "56088"
 * 说明：
 * <p>
 * num1 和 num2 的长度小于110。
 * num1 和 num2 只包含数字 0-9。
 * num1 和 num2 均不以零开头，除非是数字 0 本身。
 * 不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/multiply-strings
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || "".equals(num1) || num2 == null || "".equals(num2)) {
            return "";
        }
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        if ("1".equals(num1)) {
            return num2;
        }
        if ("1".equals(num2)) {
            return num1;
        }
        char[] num1CharList = num1.toCharArray();
        String result = "0";
        for (int i = num1CharList.length - 1; i >= 0; i--) {
            char c1 = num1CharList[i];
            String s = simpMu(c1, num2);
            s = buZero(s, num1CharList.length - 1 - i);
            result = addMu(result, s);
        }
        return result;
    }

    /**
     * 原始字符串补零
     *
     * @param or
     * @param addCount
     * @return
     */
    private String buZero(String or, int addCount) {
        StringBuilder sb = new StringBuilder(or);
        for (int i = addCount; i > 0; i--) {
            sb.append("0");
        }
        return sb.toString();
    }

    private String simpMu(char a, String b) {
        char[] bCharList = b.toCharArray();
        int jin = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = bCharList.length - 1; i >= 0; i--) {
            char c = bCharList[i];
            int cc = (c - '0') * (a - '0') + jin;
            sb.append(cc % 10);
            jin = cc / 10;
        }
        // 最后的进位
        if (jin != 0) {
            sb.append(jin);
        }
        // 单位与多位相乘返回
        String mu = sb.reverse().toString();
        return mu;
    }

    private String addMu(String a, String b) {
        StringBuilder s1 = new StringBuilder(a).reverse();
        StringBuilder s2 = new StringBuilder(b).reverse();
        while (s1.length() < s2.length()) {
            s1.append("0");
        }
        while (s2.length() < s1.length()) {
            s2.append("0");
        }
        int flag = 0;
        StringBuilder r = new StringBuilder();
        for (int i = 0; i < s1.length(); ++i) {
            int sum = f(s1.charAt(i)) + f(s2.charAt(i)) + flag;
            r.append(sum % 10);
            flag = sum / 10;
        }
        if (flag == 1) {
            r.append("1");
        }
        return r.reverse().toString();
    }

    int f(char c){return c - '0';}

    public String orgMu(String num1, String num2) {
        BigInteger big1 = new BigInteger(num1);
        BigInteger big2 = new BigInteger(num2);
        return big1.multiply(big2).toString();
    }
}